package com.hxexp.weixin.common.math;

import java.util.Arrays;
import java.util.Random;
import java.util.UUID;

import org.apache.commons.codec.binary.Hex;

/**
 * 随机数工具
 * @author li.jiang
 *
 */
public final class RandomUtil {
    private RandomUtil() {
    }
    /**
     * 生成一个随机字符串
     *
     * @param length
     *            随机字符串的长度
     * @return 随机字符串
     */
    public static String getRandomString(int length) {
        if (length >= 1) {
            byte[] randomBytes = new byte[length];
            Random random = new Random(System.nanoTime());

            random.nextBytes(randomBytes);
            // 因为encodeHex方法返回的char型数组的长度是randomBytes的两倍，
            // 为了使最终的字符串长度和length参数相符，下面对char数组做了截取拷贝操作
            char[] randomChars = Arrays.copyOf(Hex.encodeHex(randomBytes), length);

            return new String(randomChars);
        } else {
            return "";
        }
    }
    /**
     * 获取一个随机的UUID
     *
     * 该UUID已去掉"-"
     * @return
     */
    public static String getUUID() {
        UUID uuid = UUID.randomUUID();
        return uuid.toString().replace("-", "");
    }
    /**
     *  生成一个由数字组成的随机字符串
     * @param length 指定随机字符串的长度
     * @return 随机字符串
     */
    public static String getRandomNumber(int length) {
        if (length >= 1 && length <= 9) {
            StringBuilder sb = new StringBuilder("1");

            for (int i = 0; i < length; i++) {
                sb.append("0");
            }

            int maxValue = Integer.parseInt(sb.toString());
            String format = "%0" + length + "d";
            Random random = new Random(System.nanoTime());
            // 生成不大于maxValue的随机整数并返回
            return String.format(format, random.nextInt(maxValue));
        } else if (length > 9) {
            /*
             * 当length大于9时，StringBuilder转化成String表示的数字会大于int类型的最大值，
             * 造成parseInt方法做类型转换抛出异常,为了避免这种情况的发生，
             * 采用下面的函数递归调用生成大于9位数的随机数字
             */
            return getRandomNumber(9) + getRandomNumber(length - 9);
        } else {
            return "";
        }
    }
}
